home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / DiceSource / lib / amiga / divu.a < prev    next >
Text File  |  1994-02-01  |  2KB  |  104 lines

  1.  
  2.         ;   D0/D1
  3.         ;
  4.         ;   (c)Copyright 1990, Matthew Dillon, All Rights Reserved
  5.  
  6.         section text,code
  7.  
  8.         xdef    __divu
  9.         xdef    _hyper__divu
  10.  
  11. _hyper__divu:
  12. __divu:
  13.  
  14.         tst.l    D1
  15.         beq    du5
  16.         swap    D1
  17.         tst.w    D1
  18.         bne    du100    ; 32/32 -> 16
  19.  
  20.         move.l    D2,-(sp)
  21.  
  22.         swap    D1
  23.  
  24.         move.l    D0,D2
  25.         divu    D1,D2    ; 32/16 -> 16r:16q
  26.         bvs    du10
  27.         move.l    D2,D1
  28.         clr.w    D1
  29.         swap    D1    ; D1 = remainder
  30.         moveq.l #0,D0
  31.         move.w    D2,D0    ; D0 = quotient
  32.         move.l    (sp)+,D2
  33.         rts
  34.  
  35. du5        move.l    D0,D1    ; remainder = numerator
  36.         moveq.l #-1,D0    ; quotient = illegal
  37.         rts
  38.  
  39.         ;   D0:32/D1:16 = :32, remainder = SWAP D2
  40.  
  41. du10        move.l    D3,-(sp)
  42.         ;;clr.w   D2          ; D2 = r.0
  43.         ;;swap      D2          ; D2 = remainder.l
  44.         ;;move.l  D2,-(sp)
  45.         ;;sub.l   D2,D0       ; D0 = D0 - remainder (new numerator)
  46.         move.l    D0,D2
  47.         clr.w    D2
  48.         swap    D2        ; D2 = 0.msb of new numerator
  49.         divu    D1,D2        ; D2 = r.qmsb
  50.         move.w    D2,D3
  51.         swap    D3
  52.         clr.w    D3        ; D3 = qmsb.0
  53.  
  54.         move.w    D0,D2        ; D2 = r.nlsb
  55.         divu    D1,D2        ; D2 = r.qlsb
  56.  
  57.         move.w    D2,D3
  58.         move.l    D3,D0        ; D0 = quotient
  59.         clr.w    D2
  60.         swap    D2
  61.         move.l    D2,D1        ; D1 = remainder
  62.  
  63.         move.l    (sp)+,D3
  64.         move.l    (sp)+,D2
  65.         rts
  66.  
  67.         ;   32/32 -> 32 , D1 in lsb.msb order    (D0.32 / D1.32)
  68.  
  69. du100        movem.l D2-D4,-(sp)
  70.  
  71.         move.l    D0,D2
  72.         clr.w    D2
  73.         swap    D2        ; D2 = numerator 0.msb
  74.         divu    D1,D2        ; 0.msb / x.msb, D2.w = result
  75.         move.w    D2,D3
  76.  
  77.         moveq.l #0,D2
  78.         move.w    D3,D2        ; D2.l = result (0.result)
  79.  
  80.         mulu.w    D1,D3        ; D3.l = D1.w.msb x result (0.msb x)
  81.         swap    D1        ; D1 now in msb.lsb order
  82.         move.w    D2,D4
  83.         mulu.w    D1,D4        ; D4.l = D1.w.lsb x result (0.lsb x)
  84.         swap    D3        ; D3 = msb.0 x
  85.         add.l    D4,D3        ; D3 = multiplication result
  86.         sub.l    D3,D0        ; D0 = D0 - D3.
  87.         bmi    du150
  88.         move.l    D0,D1        ; D1 = remainder
  89.         move.l    D2,D0        ; D0 = quotient
  90.         movem.l (sp)+,D2-D4
  91.         rts
  92. du150        subq.l    #1,D2        ; D0 is negative, add D1 until it becomes +
  93.         add.l    D1,D0
  94.         bmi    du150
  95.         move.l    D0,D1        ; D1 = remainder
  96.         move.l    D2,D0        ; D0 = quotient
  97.         movem.l (sp)+,D2-D4
  98.         rts
  99.  
  100.         END
  101.  
  102.  
  103.  
  104.